Захист програм від комп`ютерних вірусів

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Реферат з інформатики
учня 11-А класу школи № 776
Південно - Східного адміністративного округу
на тему:
Захист програм
від комп'ютерних вірусів
Афоніна Сергія Вікторовича

Зміст "1-3"
Передмова ................................................. .................................................. ................. 3
1. ЩО ТАКЕ КОМП'ЮТЕРНІ ВІРУСИ .............................................. ............. 4
2. ЦИКЛ ФУНКЦІОНУВАННЯ ВІРУСІВ ............................................... ......... 4
3. «ВАКЦИНАЦІЯ» ПРОГРАМ .............................................. ................................ 5
3.1. Тема виконуваних файлів ............................................... ........................... 6
3.2. Захист новостворених програм .............................................. ................... 8
3.3. Модуль F_Anti ................................................ .................................................. ..... 9
4. ЗАХИСТ ІСНУЮЧИХ ЕХЕ-Фото ............................................. ..... 11
4.1. Опис програм SetFag.pas і Fag.asm ......................................... ............... 12
4.2. Програма AntiVir ................................................ .............................................. 15
5. ДЕЯКІ РЕКОМЕНДАЦІЇ ................................................ ......................... 17

Передмова

У розділі аналізується механізм розповсюдження і
функціонування вірусів в операційній системі
MS - DOS і на основі аналізу пропонуються досить
ефективні способи боротьби з ними. Наводяться
описи трьох різних програм, що забезпечують
виявлення та ліквідацію вірусів. Модуль F _ Anti може
використовуватися для автоматичного захисту знову
розроблюваних Турбо Паскалева програм. Програма
AntiVir здійснює виявлення та ліквідацію
завантажувальних вірусів і контроль будь-яких виконуваних
файлів на основі зіставлення найбільш уразливих для
вірусу частин файлів з ​​їх еталонними копіями. Нарешті,
комплекс програм SetFag. exe і Fag, prg дасть Вам
можливість встановити антивірусну програму-фаг
на будь-який вже створений ЕХЕ-файл: у момент запуску
програми фаг перевірить її стан, якщо програма
вражена вірусом, повідомить про це і видалить вірус.

1. ЩО ТАКЕ КОМП'ЮТЕРНІ ВІРУСИ

Якщо Ви маєте досвід тривалої роботи з ПК, то, можливо, вже стикалися з комп'ютерними вірусами або хоча б чули про них. Комп'ютерний вірус-це програма, що виконує у Вашому ПК дії, в яких Ви не маєте потребу і про які не підозрюєте. Головною її особливістю є здатність до «розмноження», тобто до створення безлічі готових до подальшої роботи примірників вірусу. Віруси «чіпляються» до звичайних виконуваних файлів типу. ЕХЕ,. СОМ або до завантажувальнимсекторів фізичних носіїв інформації (дискет) і таким чином потрапляють від одного ПК до іншого.
Були спочатку цілком невинна розвагою нудьгуючих програмістів комп'ютерні віруси сьогодні стали справжнім лихом для користувачів ПК: кількість і типи таких програм ростуть із загрозливою швидкістю, а самі віруси в ряді випадків придбали вельми неприємні властивості-деякі з них здатні знищувати файлову структуру дисків з усіма катастрофічними для користувача наслідками. В літературі [14] описується безпрецедентний випадок, коли вірус на Три дні (з 2 по 4 листопада 1988 р.) вивів з ладу фактично всю комп'ютерну мережу США. Були паралізовані комп'ютери Агентства національної безпеки, Стратегічного командування ВПС США, локальні мережі всіх великих університетів та дослідницьких центрів. Лише в останній момент вдалося врятувати систему керування польотом космічних кораблів Шаттл. Положення було настільки серйозним, що до розслідування негайно приступило ФБР. Винуватцем катастрофи, що заподіяла збиток більш ніж в 100 мільйонів доларів, виявився студент випускного курсу Корнеллського університету Р. Морріс, який придумав досить хитру різновид вірусу. Він був виключений з університету з правом поновлення через рік і засуджений судом до сплати штрафу в 270 тисяч доларів і трьох місяців тюремного ув'язнення.
Важко пояснити, для чого програмісти витрачають сили і час на створення все більш витончених типів вірусу, оскільки їх автори майже завжди залишаються чи сподіваються залишитися анонімними, так що природне для людини прагнення до популярності тут виключено. Може бути це невдалий жарт (цієї версії дотримувався Р. Морріс), можливо це пов'язано з патологічними відхиленнями у психіці, а може бути пояснення криється у прагненні заробити на створенні антивірусних програм? Як би там не було, нам не можна не рахуватися з можливістю зараження ПК комп'ютерним вірусом.

2. ЦИКЛ ФУНКЦІОНУВАННЯ ВІРУСІВ

У циклі існування будь-якого вірусу можна виділити три етапи. Спочатку вірус знаходиться в неактивному стані. У цьому стані він впроваджений в тіло виконуваного файлу або знаходиться в завантажувальному секторі диска і «чекає» свого часу. Саме в неактивному стані віруси переносяться разом з програмами або дискетами від одного ПК до іншого (обмін програмами між користувачами ПК-явище буденне, і Ви самі, читач, можливо копіювали любиться Вам гру або текстовий редактор, не підозрюючи, що копіюєте ще й вірус) . Зрозуміло, в неактивному стані вірус нічого не може зробити. Для того щоб він почав свою роботу, необхідно запустити виконуваний файл або завантажитися з зараженої дискети. У цей момент активізується вірус, який або створює резидентну в пам'яті програму, здатну породжувати копії або робити якісь руйнівні дії, або негайно приступає до роботи.
Якщо вірус створив резидентну програму, то її активізація здійснюється різними способами - все залежить від фантазії автора вірусу. Зазвичай вірус перехоплює переривання $ 21, що є ключовим для доступу до будь-яких операцій з MS - DOS. Таким чином, будь-яка спроба читання або запису інформації на диск або звернення до клавіатури дисплея призводить до активізації резидентної програми вірусу. Після одержання керування (або активізації резидентної програми) вірус приступає до «розмноження»: він відшукує відповідний виконуваний файл і впроваджує свій код в його тіло (див. нижче). Як правило, вірус заражає лише один виконуваний файл за раз, щоб користувач не звернув уваги на надмірне уповільнення в роботі програм: другий етап життєдіяльності вірусу - це етап активного розмноження, тому вірусна програма прагне максимально приховати від користувача ПК результати своєї діяльності.
Після того як заражене досить багато файлів, може наступити третій етап, пов'язаний із зовнішніми проявами роботи вірусу. Ваш комп'ютер раптом почне вести себе дивно: зазвучить чи музична фраза, або почнуть «сипатися» символи на екрані дисплея-не суть важливо, головне, що тільки в цей момент Ви з жахом згадайте, що на жорсткому диску знаходяться надзвичайно важливі для Вас дані або програми, які Ви не встигли або не змогли скопіювати на дискети. На жаль! Деякі віруси до цього моменту можуть вже безповоротно порушити файлову структуру.
Що робити при виявленні вірусу? Перш за все не панікувати, адже далеко не всі віруси відрізняються «кровожерністю». Слід вимкнути комп'ютер, вставити в привід гнучкого диска заздалегідь припасену еталонну системну дискету (ніколи не знімайте з неї захист!) І знову включити комп'ютер. Якщо на ПК є спеціальна кнопка для перезавантаження {RESET або INIT), можна використовувати її і не вимикати / включати комп'ютер, але у всіх випадках не намагайтеся перезавантажитися з допомогою Ctrl-Alt-Del: від деяких типів вірусу Ви не позбудетеся таким чином. Потім потрібно запустити будь-яку програму-антивірус (наприклад, AIDSTEST Д. Н. Лозинського) і з її допомогою локалізувати і видалити вірус. Якщо антивірусна програма не може виявити вірус або у Вас під рукою немає такого роду програм, слід спробувати звернутися до потрібного Вам жорсткого диска і, якщо це вдасться зробити, скопіювати всі найбільш цінне (але тільки не виконувані файли!) На дискети. Після цього заново переформатувати жорсткий диск, перенести на нього еталонну копію ДЗГ та відновити з дискет те, що вдалося врятувати.

3. «ВАКЦИНАЦІЯ» ПРОГРАМ

Що ж слід зробити, щоб ця безрадісна картина не стала реальністю? Один відповідь очевидна-періодично (і по можливості частіше) зберігати життєво важливі для Вас результати роботи на дискетах. Немає нічого простішого, ніж дати цю раду, набагато складніше змусити себе слідувати йому: я сам, чесно кажучи, далеко не кожен день витрачаю час на архівування. Друга відповідь менш очевидний. З його простою ідеєю я вперше познайомився в прекрасній статті Ф. М. Шерстюка.
Ось ця ідея: треба зробити «вакцинацію» виконуваних програм, тобто надати їм властивість самодіагностики, що дозволяє провести контроль власного файлу і з'ясувати, заражений він чи ні. Якщо факт зараження встановлено, програма може спробувати відновити свій початковий вигляд, тобто видалити причепивши до її файлу вірус. Якщо цю ідею послідовно втілювати в життя, то більшість Ваших програм придбає стійкий «імунітет» до вірусів, у всякому разі, вони зможуть достатньо швидко повідомити Вам про факт зараження.
Переваги цієї ідеї очевидні: на відміну від розробників численних антивірусних програм, які борються з конкретними різновидами вірусів, Ви можете зберегти у файлі програми деяку ключову інформацію про її незараженою вигляді, і тому факт зараження будь-яким видом вірусу може бути легко встановлений у момент запуску Вашої програми .

3.1. Тема виконуваних файлів

Яку саме інформацію про незараженою файлі слід зберігати? Для відповіді на це питання необхідно знати угоду ДОС про формат виконуваних файлів. Як відомо, існують два формати: СОМ і ЕХЕ. Будь-яка програма, що обробляється системою Турбо Паскаль версії 4.0 та вище, може бути відтранслювати тільки в ЕХЕ-файл, тому всі подальші міркування відносяться саме до цього формату.
На початку ЕХЕ-файла розташовується заголовок, в якому міститься вся інформація, необхідна для перетворення дискового файлу в готову до роботи програму. Перші 28 байт заголовка відповідають такою структурою даних:
Type
  HeadExeType = record
  Sign: Word; {Ознака ЕХЕ-файла}
  PartPag: Word; {Частина неповного сектора в кінці файлу}
  PageCnt: Word; {Кількість секторів, включаючи неповний}
  ReloCnt: Word; {Кількість елементів у таблиці переміщення}
  HdrSize: Word; {Довжина заголовка в параграфах}
  MinMem: Word; Мінімальна розмір купи (у параграфах)}
Махмет: Word; {Максимальний розмір купи (у параграфах)}
  ReloSS: Word; {Початкове значення сегмента стека SS}
  ExeSP: Word; {Початкове значення покажчика стека SP}
  ChkSum: Word; {Контрольна сума всіх слів файлу}
  ExelP: Word; {Зсув точки запуску програми}
  ReloCS: Word; {Початкове значення сегмента коду CS};
  TabiOff: Word; {Зсув першого елемента таблиці переміщення}
  Overlay: Word; {Номер оверлея або 0 для основної програми}
end; {HeadExe}
Інші елементи заголовка містять так звану таблицю переміщення, призначену для настройки адрес завантаженої програми. Таблиця починається з байта TabiOff від початку файлу і містить ReloCnt чотирибайтових елементів наступного виду:
Type
ReloTablltem = record
ItemSeg: Word; {Сегмент переміщуваного адреси}
        IternOfs: Word; {Зсув переміщуваного адреси}
end;
Ознака ЕХЕ-файлу зберігається в полі Sign у вигляді символів «MZ» (код $ 5A4D) - з цієї ознаки повинен починатися будь-який ЕХЕ-ф Айл. Поле HdrSize містить довжину всього заголовка в параграфах (дільницях пам'яті довжиною по 16 байт кожний). Поля PartPag і PageCnt визначають загальну довжину завантажується в пам'ять частини ЕХЕ-файла за такою формулою:
L = (PageCnt-l) * 512 + PartPag - HdrSize * 16
Інша частина файлу (довжина ЕХЕ-файла може бути більше L + HdrSize * 16) при завантаженні програми не враховується. Зазвичай у залишку файлу, створеного системою Турбо Паскаль, (якщо, зрозуміло, є залишок) міститься інформація, яка використовується вбудованим відладчиком, або оверлеї.
Переважна більшість ЕХЕ-вірусів пристиковується свою програму в кінець файлу, а для того щоб ця програма була завантажена в пам'ять і їй було передане управління, змінює поля PartPag, PageCnt, ReloCS, ExelP (Адреса точки, куди передається управління після закінчення завантаження) і, можливо, деякі інші поля. При такому способі впровадження загальна довжина завантажується в пам'ять частини файлу повинна складати
ExeSize = FileSize + VirusSize,
де FileSize - повна довжина ЕХЕ-файла, а VirusSize-довжина програми вірусу. Так як в залишку фала можуть зберігатися оверлеї (або архів для саморозвантажних архівних програм), довжина ExeSize може виявитися через-мірно великий, так що програма не зможе завантажитися в пам'ять або не зможе працювати нормальним чином. Деякі безграмотно написані віруси не зважають на цю обставину і швидко видають себе, тому що заражені програми перестають працювати.
Інший спосіб впровадження вірусу-пристикування коду вірусу до початку завантажується частини програми і одразу за заголовком файлу. L - Завантажувана в пам'ять частину файлу.
Такий спосіб впровадження дозволяє не завантажувати в пам'ять весь ЕХЕ-файл, а довжина завантаженої програми збільшується тільки на довжину коду вірусу. Незважаючи на удавану перевага такого способу, він використовується досить рідко. Його реалізація значно складніше, тому що перед передачею управління основній програмі вірус повинен перенести 256 байт префікса програмного сегмента {PSP) в кінець власного коду так, щоб вони безпосередньо передували тілу програми-в іншому випадку буде порушена важлива зв'язок програми з PSP або відносна адресація в самій програмі.
Крім того, в процесі зараження він повинен збільшити на величину VirusSize полі IternOfs кожного елементу таблиці переміщення і абсолютної адреси, зазначених цим елементом. На відміну від стандартного завантажувача ДОС вірусу доводиться коригувати не завантажену програму, а її файловий образ. Так як в ЕХЕ-програмі середньої складності може бути кілька сотень елементів таблиці переміщення, процес настройки таблиці вірусом призводить до помітного збільшення часу запуску програми, що може виявитися користувачем. На етапі розмноження віруси прагнуть по можливості приховати від користувача результат своєї діяльності, тому ЕХЕ-файли рідко дивуються вірусами, пристикувався в початок файлу.
Зрозуміло, існує можливість проникнення вірусу безпосередньо в тіло виконуваної програми. Однак на практиці це майже завжди означає руйнування логіки роботи програми, тому такий вірус негайно виявляється.
Аналіз сказаного дозволяє зробити важливий висновок: практично будь-який існуючий вірус (або вірус, який ще тільки буде створений!), Розрахований на ураження ЕХЕ-файла, пристиковується свій код в кінець файлу і змінює його заголовок. Отже, для контролю факту зараження програми і ліквідації вірусу необхідно десь зберегти заголовок файлу і його еталонну довжину і періодично зіставляти дійсний заголовок і довжину з еталонними значеннями. При цьому слід враховувати ту обставину, що деякі віруси контролюють будь-яке звернення до дискових секторів, у яких розташована їхня програма, і «підсовують» незара-ковими копії цих секторів. Такі віруси (їх називають віруси-невидимки) навряд чи вдасться виявити за допомогою стандартного звернення до функцій ДОС. Для боротьби з ними використовують пряме звернення до BIOS-переривання $ 13.

3.2. Захист новостворених програм

Ключову інформацію (будемо для стислості називати її ключ) про незараженной програмі можна зберігати в окремому файлі, але в цьому випадку існує небезпека втратити додатковий файл при копіюванні програми або помилково знищити його. Набагато надійніше зберігати ключ в тілі самого захищається файлу. На жаль, його не можна подібно вірусу при-стикувати в кінець файлу, тому що у разі зараження вірус змінить поля PartPag і PageCnt і ми ніколи не зможемо визначити те місце у файлі, де він розташовується. Згадаймо, що всі константи (у тому числі і типізовані) створюються на етапі компіляції програми, таким чином у файлі обов'язково є область даних, що містить значення цих констант. Ця область в Турбо Паскалева програмах розташовується в самому кінці завантажується частини файлу (см.ріс.6.2).
Отже, ми повинні оголосити в програмі типізовану констант, призначену для зберігання ключа, а потім в область файлу, відведену для її розміщення, помістити потрібну інформацію.
Яким чином відшукати в ЕХЕ-файлі місце, займане ключем? Звичайно, можна перед ним у програмі розмістити будь-яку типізовану константу з характерним значенням (наприклад, заздалегідь обумовлену текстовий рядок) і потім відшукувати її у файлі. Однак таке рішення навряд чи можна визнати задовільним: по-перше, завжди існує ймовірність того, що якийсь фрагмент кодів програми містить ту ж ланцюжок байт, що і заголовок ключа, по-друге, доведеться переглядати часом великий за обсягом ЕХЕ-файл у пошуках потрібної константи. Значно витонченіше виглядає рішення, засноване на точному обчисленні зміщення від початку файлу до ключа.
Для цього потрібно визначити початок області даних у файлі. У заголовку файлу не передбачено ніякої інформації про початковий значенні регістру DS, в якому зберігається сегмент даних. Перед передачею управління програмою завантажувач встановлює значення цього регістра так, щоб він вказував на початок так званого префікса програмного сегмента {PSP), а запущена програма вже сама повинна встановити його належним чином.
Префікс програмного сегмента має довжину 256 байт (16 параграфів) і розміщується завантажувачем в оперативній пам'яті безпосередньо перед завантаженою програмою. У PSP міститься різна службова інформація, яка може бути досить важливою для ДЗГ та працюючої програми (в PSP, наприклад, зберігаються параметри звернення до програми), але в ньому немає вказівок на вміст регістра DS. Таким чином, знайти початок області даних у файлі досить важко. Однак це неважко зробити в працюючій програмі-для цього передбачена стандартна функція DSeg, що повертає сегмент даних. Якби програма могла одержати також інформацію про сегмент PSP, з якого починається завантажена програма, можна було б обчислити зміщення у файлі від його початку до початку області даних. Така можливість є-функція MS - DOS з номером $ 62 повертає в регістрі ВХ значення сегмента PSP. Отже, програма повинна отримати значення обох сегментів, обчислити їх різницю і таким чином визначити місце в файлі, з якого починається область даних.
Залишається остання проблема-як знайти потрібну константу. Турбо Паскаль розміщує константи в області даних у міру їх оголошення в програмі. Знаючи розмір кожної константи і порядок їх оголошення, можна вирахувати місце розміщення потрібної нам типізованої константи. Однак цей метод не годиться для універсальної програми захисту, так як порядок оголошення констант може змінюватися від програми до програми. На щастя, ми можемо використовувати операцію отримання адреси @. Результатом застосування цієї операції до адреси константи, обраної як ключа, є вказівник (чотирибайтових адреса); зсув адреси, який він містить, і є потрібним нам зсувом початку ключа щодо початку області даних.

3.3. Модуль F_Anti

У цьому параграфі описується модуль F _ Anti, в якому здійснюються всі необхідні дії по встановленню ключа у знову створюваний ЕХЕ-файл і подальшій перевірці цього ключа при кожному завантаженні програми. Повний текст модуля див. пріл.П7.
Як ключ для контролю факту зараження ЕХЕ - файлу у модулі F _ Anti використовується типизированная константа Head, відповідна такій структурі даних:
Type
НТуре = record
НЕ: HeadExeType; {Еталонний заголовок файлу}
HL: Longint; {Еталонна довжина файлу}
HF: Boolean; {Прапор установки ключа}
Key: Word; {Шифр для захисту ключа}
end;
При створенні цієї типізованої константи компілятор в полі HF поміщає значення False. Запущена програма аналізує це поле. При першому прогоні HF = False, в результаті чого програма викликає процедуру Save, у ході виконання якої у файлі зберігаються еталонний заголовок і початкова довжина файлу. При цьому одночасно в полі HF (у файлі програми!) Поміщається значення True, тому при будь-якому наступному запуску програми замість Save буде викликана процедура CheckFile, яка здійснить потрібний контроль файлу. Якщо в ході контролю виявляється хоча б найменша відмінність заголовка файлу від його еталона, який зберігається в Head, програма повідомляє про факт зараження і пропонує відновити зіпсований заголовок і початкову довжину файлу.
При відновленні зараженого файлу здійснюються наступні дії:
• заражений файл копіюється у файл з розширенням VIR-це дозволить Вам у разі невдалої спроби відновлення повторити її ще раз, крім того, при бажанні Ви зможете передати розробникам антивірусних програм копію вірусу для вироблення методів його виявлення і знищення;
• аналізується адресу запуску зараженої програми: якщо відносне значення сегмента точки запуску у зараженої програми менше, ніж у еталоні, то це означає, що вірус розташовується на початку або в середині.
Якщо програма запускається на вже зараженому ПК. Не виключено, що заголовок файлу буде зіпсований вірусом, і тоді система захисту буде ревно стежити за збереженням вірусу! У цьому випадку програма попереджає користувача про неможливість відновлення (якщо Вас зацікавив описуваний спосіб боротьби з вірусами, спробуйте модифікувати програму захисту так, щоб вона працювала і в цьому випадку);
• якщо вірус пристикований в кінець файлу, то в відновлюваний файл переноситься еталонний заголовок і незараженою частина, починаючи з байта TablOff + ReloCnt '4 від початку файлу і до байта FileSize - HL Відзначу таку обставину. Описана система захисту дублює заголовок файлу в тіло програми. Ніщо не заважає вірусу перевірити тіло програми на наявність дубліката та відповідним чином змінити його. Я далекий від думки, що Ви,, шановний читач, після знайомства з цим розділом захочете створити власний вірус, що враховує цю обставину. Тим не менш, я вважаю, що незайвою буде якийсь захист самого ключа. Такий захист реалізується дуже просто: для цього досить всі 16-бітові поля еталона заголовка скласти по модулю 2 з випадковою константою Key, З цією метою в процедуру Save поміщений наступний фрагмент (див. текст модуля в пріл.П7):
{Зашифрувати ключ:} Randomize; Head.Key: = Random ($ FFFF);
with Head,
Head. HE do for k = I to 14 do
Hem [k]: = HE. Hem [k] xor Key;
(Масив Hem суміщений у пам'яті з його записала у файлі еталонним заголовком, а НЕ. Ні-с заголовком файлу в момент першого запуску).
Ініціація генератора випадкових чисел за допомогою процедури Randomize гарантує, що шифр Head. Key не буде повторюватися в різних програмах. У процедурі CheckFile за допомогою операторів
{Дешифрує ів ати ключ:}
  with Н, Н. НЕ do for k: = I to 14 do Hem [k]: = Hem [k] xor Key;
відновлюється початковий вигляд ключа.
Процедура CheckFile, що здійснює установку або контроль ключа, викликається в ході виконання настановної частини модуля F _ Anti, тому для використання описаного методу захисту досить вказати ім'я модуля в реченні Uses. Зауважу, що у разі розробки програми з оверлеями модуль F _ Anti можна оголосити оверлейних, якщо в настановної частини будь-якого неоверлейного модуля ініціюється робота адміністратора оверлея.
У розпорядженні програміста є глобальна змінна CheckVirasResult, що сигналізує про результати перевірки програми. Значення цієї змінної інтерпретує наступним чином:
0; {Не знайдено факт зараження} 1; {Перший запуск, у програмі встановлено захист}
-1; {Вірус знешкоджений за згодою користувача}
-2; {Вірус знешкоджений автоматично}.
-3; {Контроль пригнічений ключем / NOANTI}
-4; {Вірус розташований на початку програми}
Робота процедури CheckFile може бути пригнічена, якщо програма за-пускається з ключем / NOANTI. Ключ / NOQUERY дозволяє автоматичне видалення виявленого вірусу без дозволу користувача.
Ключ / NOALARM також дозволяє процедурі автоматично видалити вірус, але забороняє видавати на екран попередження. Нарешті, ключ / NOCOPY забороняє створення резервної копії зараженого файлу (з розширенням VIR).
Наступна проста програма ілюструє техніку використання модуля F - Anti. Якщо Ви скомпілюєте цю програму у файл testanti. Exe, то після команди testanti на екрані з'явиться повідомлення
Встановлено захист файлу TESTANII. EXE. При першому запуску програми і В файлі TESTANTI. EXE вірус не виявлено.
при кожному наступному запуску. Якщо запустити програму командою
testanti / Noanti на екран буде виведено повідомлення Контроль блокований ключем / NOANTI.
Uses FAnti; begin
case CheckVirusResuit of
0: WriteLn ('B файлі', ParamStr (0), 'вірус не виявлений .*);
1: WriteLn ('Встановлено захист файлу', aramStr (0) ,*.*);
-1: WriteLn ('Вірус видалений з дозволу користувача.');
-2: WriteLn ('Вірус вилучений автоматично.');
-3: WriteLn З Контроль блокований ключем / NOANTI .*);
-4: WriteLn З Вірус розташований на початку * +
'Файлу - видалення неможливо.')
end
end.

4. ЗАХИСТ ІСНУЮЧИХ ЕХЕ-Фото

Отже, «вакцинація» знову розроблювальних програм не представляє особливої ​​складності. А як захистити вже існуючу ЕХЕ-програму? Для цього існують дві можливості: або використовувати окрему програму, яка зберігає ключову інформацію і здійснює перевірку на вимогу користувача (така програма обговорюється в наступному розділі), або пристикувати до захищається програмі невеликий код «вірусного фага»-тоді перевірка буде здійснюватися автоматично при кожному запуску програми. У цьому розділі ми обговоримо техніку створення та впровадження в захищається. програму антивіруса-фага, тобто невеликий ассемблерной програми, яка використовує той же механізм перехоплення управління, що і звичайний вірус, але здійснює потрібну захист програми.
Програма - фаг встановлюється спеціальною програмою-монтажником і до моменту початку своєї роботи вже повинна мати у своєму розпорядженні еталонний заголовок файлу. Отримавши управління, фаг перевіряє заголовок відповідного файлу і, якщо виявлено зміни, повідомляє про це користувачеві і видаляє вірус. Після закінчення роботи фаг передає управління захищається програмі. Оскільки фаг пишеться цілком на асемблері, його робота протікає дуже швидко без помітного уповільнення завантаження програми. Якщо Ви встановити такий фаг на більшу частину часто використовуваних програм, Ваш комп'ютер буде захищений дуже надійно.
Щоб правильно спроектувати фаг, потрібно добре уявляти собі механізм запуску ЕХЕ - програм. Стандартний завантажувач ДОС реалізує наступну послідовність дій при запуску програми.
1) Створюється префікс програмного сегменту PSP. Зазвичай для цього використовується функція ДОС $ 26.
2) У деяку локальну область пам'яті прочитуються початкові 28 байт заголовка ЕХЕ - файлу, відповідні структурі даних HeadExeType.
3) Визначається розмір завантажується частини файлу за формулою
LengExe = (PageCnt-l) * 512 + PartPag
4) Визначається файлове зсув завантажується частини:
SeekExe = HdrSize * 16
5) Вибирається сегментний адресу StartSeg для розміщення програми.
Зазвичай StartSeg = Segment {PSP) +16, тобто програма розміщується відразу за PSP, який має довжину 256 байт (16 параграфів).
6) Зчитується завантажувана частина програми на безперервну область пам'яті довжиною LengExe, що починається за адресою StartSeg: 0000.
7) Покажчик файлу встановлюється на початок таблиці переміщення TablOff,
      8) Для кожного елемента переміщення (цих елементів ReloCnt):
зчитується елемент як два 16-бітних слова IternOfs, ItemSeg;
обчислюється ReloSeg === StartSeg + ltemOfs, тобто сегментна частина зміщення абсолютної адреси переміщуваної посилання;
• витягується слово за адресою ReloSeg: ltemOfs-сегментна частина переміщуваної посилання;
• до цього слова додається StartSeg (здійснюється так звана прив'язка сегмента);
• результат втягнений за адресою ReloSeg: ltemOfs.
9) Виділяється пам'ять за кінцем програми у відповідності до значень
MinMem й Махмет.
      10) Ініціюються регістри і запускається програма:
• регістри ES і DS отримують значення сегмента, в якому розташовується PSP ',
регістр АХ відображає коректність ідентифікаторів дисків в командному рядку (при нормальному запуску містить 0);
SS = StartSeg + ReloSS;
SP = ExeSP;
CS == StartSeg ^ ReloCS;
   IP = Exelp;
вміст інших регістрів не має значення. Регістри сегменту коду CS і покажчика інструкцій IP звичайно ініціюються наступними трьома командами:
PUSH StartSeg + ReloCs
PUSH Exelp
RETF
(Команда RETF далекого повернення з підпрограми витягує із стека два слова-зміщення і сегмент адреси переходу-і поміщає їх відповідно в IP і CS).
Таким чином, відразу після здобуття управління фаг має зберегти значення регістрів АХ і DS і помістити в DS значення власного сегменту даних. На практиці сегмент даних в коротких ассемблерних програмах зазвичай збігається з сегментом коду, тобто програма і дані розміщуються в одному сегменті. Сегмент стека SS можна не змінювати, тому що програма-інсталятор фага повинна подбати про те, щоб стік не зруйнував код самого фага, і відповідним чином налаштувати ReloSS та / або ExelP. Звичайно в ЕХЕ-програмі початкове значення ReloSS таке, що стек розміщується відразу за кінцем програми, тобто в тому місці, куди програма-інсталятор поміщає "код фага. Довжина стека ExeSP як правило більш ніж достатня для того, щоб робота фага зі стеком не призвела до руйнування коду фага, тому в більшості випадків інсталятор залишає початкові значення ReloSS і ExeSP без зміни.

4.1. Опис програм SetFag.pas і Fag.asm

У цьому параграфі описуються програми SetFag. Pas і Fag. Asm, за допомогою яких реалізується описаний вище механізм захисту. Програма SetFag (Пріл.П8.1) здійснює установку фага, а програма Fag. Asm (пріл.П8.2) містить сам фаг. Якщо Ви захочете скористатися запропонованими програмами, відкомпілюйте Турбо Ассемблером файл Fag. Asm командою
tasm fag / L
У ході компіляції на екран буде виведено 13 попереджень виду
Warning * Open procedure: XXXXXX а наприкінці зведення:
Error message: None Warning message: 13 Passes: I Remainig memory: XXXК
Якщо в рядку Error message замість None вказано число виявлених помилок, перегляньте файл лістингу компіляції fag. lst, відшукайте в ньому • повідомлення компілятора про помилки та усуньте їх. Потім перетворіть отриманий файл fag. Obj в програму Fag. Prg командою
tiink fag, fag.prg
Компонувальник повинен повідомити Warning: No stack
Зауважу, що програма Fag. Prg не може працювати самостійно без попередньої настройки монтажником SetFag. Exe, тому в цілях обережності їй присвоюється нестандартне розширення PRG. Для встановлення захисту на будь-який ЕХЕ-ФАІ л треба дати команду
setfag NAME,
де NAME-ім'я захищається файлу. Іншими словами, назва файлу передається програмі установки фага SetFag. Exe за допомогою параметрів запуску. В імені NAME можна опускати стандартне розширення ЕХЕ, а також дозволяється вказати маршрут пошуку файлу та / або символи-замінники ДОР «*» і «?» Для визначення групового імені-в цьому випадку захист буде встановлена ​​на кожен файл, відповідний групового імені. Наприклад, команда
setfag d: \ mydir *
означає вимога встановити захист на всі ЕХЕ-файли з каталогу MYDIR на диску D.
Перед установкою зашиті програма здійснює серію перевірок файлу. Вона перевіряє заголовок файлу і блокує встановлення захисту, якщо перші два байти заголовка не відповідають сигнатурі «MZ» (ознакою ЕХЕ-файла). Крім того, вона перевіряє «хвіст» файлу з тим, щоб переконатися у відсутності коду фага, і блокує повторну установку захисту на вже захищений файл. Далі, захист не устанвлівается також у тому випадку, якщо довжина завантажується частини файлу стане занадто великий (перевищить доступну пам'ять). Якщо в кінці файлу виявлена ​​незавантажувальних частина, програма інформує про це користувача і запитує в нього підтвердження на установку за-хисту. Після завершення всіх перевірок програма створює резервну копію вихідного файлу з розширенням ВАК. Створення ВАК-файлу можна заборонити, якщо команду виклику доповнити ключем / NOBAK, наприклад setfag myprog / nobak. Для захисту використовується ключ, відповідний такій структурі даних:
Type
  HeadType = record
case Byte of
1: (Sign: Word; {Сигнатура 'MZ' = $ 5MD}
PartPag: Word; {Частина неповного сектора}
PageCnt: Word; {Кількість секторів}
ReloCnt: Word; {Кількість елементів у таблиці переміщення}
HdrSize: Word; {Довжина заголовка в параграфах}
MinMem: Word; {Мінімальний розмір купи}
Махмет: Word); {Максимальний розмір купи}
end.
Зрозуміло, фаг не можна встановлювати на файли, захищені засобами модуля F _ Anti так як в цьому випадку процедура CheckFile цього модуля виявить зміна заголовка і видалить фаг. Крім того, фаг пристиковується в кінець програми і, отже, не може захищати великі програми. Остання обставина контролюється монтажником SetFag.
ReloSS: Word; {Початкове значення сегмента стека SS}
ExeSP: Word; {Початкове значення покажчика стека SP}
ChkSum: Word; {Контрольна сума всіх слів файлу}
   ExelP: Word; {Зсув точки запуску програми}
   ReloCS: Word; {Початкове значення сегмента коду CS});
2: (W: array [1 .. 12] of Word) end;
TAVir = record
Head24: HeadType; {24 байта еталонного заголовка}
Starts: Word; {Відносний сегмент}
StartO: Word; {і зміщення точки запуску програми} Leng24: Longint; {Довжина незараженной програми мінус 24 байта}
Key: Word; {Ключ шифровки}
end;
Як бачимо, цей ключ-дещо відрізняється від використаного в модулі F _ Anti: зберігаються тільки 24 байта заголовка (навряд чи вірус змінить зсув таблиці TablOff і номер оверлея Overlay), виключено непотрібне тепер поле HFf додані поля StartS і StartO для запам'ятовування відносного адреси точки запуску захищається програми. Поле Key як і раніше містить шифр для захисту ключа. Сумарна довжина ключа SizeOf {TAVir) складає 34 байта.
Процес встановлення захисту складається з наступних етапів.
1) У динамічну пам'ять зчитується код фага з файлу FAG. PRG. Ви можете створити свій варіант фага і змусити програму SetFag використовувати його, якщо в команду запуску інсталятора додасте ключ / F: NameFag. Ext, де NameFag, Ext-ім'я і розширення файлу, що містить розроблений Вами фаг. У цьому випадку врахуйте, що SetFag поміщає 34-байтний ключ в самий початок коду фага (див. лістинг FAG. ASM) і тому при зчитуванні з файлу пропускає 34 байти від початку його завантажується частини. Виділення коду фага в окремий P ^ G-файл знадобилося мені на етапі розробки і налагодження коду фага. Я вирішив зберегти можливість завантаження коду з зовнішнього файлу для того, щоб Ви змогли при бажанні поекспериментувати з цим кодом.
2) У полі Head24 змінної НН типу TAVir зчитується заголовок ЕХЕ-файла і здійснюється настройка ключа НН: у полях StartS і StartO запам'ятовується відносний адресу точки запуску захищається програми; обчислюється файлове зсув LS в параграфах, відповідне повній довжині файлу і вирівняне на кордон параграфа - з цим зміщенням від початку файлу в нього буде поміщений ключ і тіло фага (вирівнювання на границю параграфа необхідно для того, щоб забезпечити коректність внутрішньосегментний адресації коду фага); в ReloCS поміщається нове значення відносного сегмента точки запуску фага, а в ExelP-зміщення цієї точки ; розраховується нове значення довжини завантажується частини файлу з урахуванням ключа і тіла фага і відповідним чином змінюються поля PageCnt і PartPag; перевіряються і при необхідності коректуються поля MinMem і ExeSP так, щоб стік не зруйнував код фага.
3) У початок ЕХЕ - файлу записується новий заголовок HH. H ead 24, після чого здійснюється зсув файлового покажчика на 15 * 16 байт від початку файлу і в нього записується зашифрований ключ і тіло фага. Ассемблерние програма FAG. ASM працює наступним чином.
Відразу після здобуття управління фаг зберігає в стеку регістр АХ, запам'ятовує у змінній PSP значення регістра сегмента даних DS (в цей момент він вказує на префікс програмного сегменту) і поміщає в DS сегмент коду CS (дані і код фага розташовані в одному сегменті). Крім того, у змінній SPO запам'ятовується вершина стека, а в CSO - сегмент коду фага. Потім обчислюється абсолютний сегмент точки запуску захищається програми (як уже говорилося, він дорівнює PSP + 16) і знайдене значення міститься в StartS-таким чином готується запуск захищається програм.
Вся основна робота фага запрограмована в серії послідовно викликаються процедур (при розробці фага використовувався метод спадного програмування). Спочатку за допомогою процедури GetExeNome фаг визначає повне ім'я захищається ЕХЕ - файлу. Для цього використовується та обставина, що у версіях ДОС 3.0 і вище стандартний завантажувач поміщає повне ім'я файлу, що завантажується в розширене оточення ДОС. Оточення ДОС - це область пам'яті довжиною до 32 Кбайт, в якій ДОС зберігає змінні оточення типу COMSPEC, PATH, PROMPT і т.п. Кожна змінна оточення являє собою текстовий рядок, складену з кодів ASCII, в кінці якої ставиться байт 0 як ознака кінця рядка - фірма IBM називає такий код ASCIIZ (Z - Zero, нуль). Змінні оточення розташовуються в пам'яті послідовно один за одним. В кінці «стандартної» частини оточення (ця частина підтримується і в ранніх версіях ДОС) ставиться додатковий нульовий байт. За стандартною частиною слід розширена частина, куди завантажувач нових версій ДОС поміщає повне ім'я файлу (з зазначенням диска і маршруту пошуку) і, можливо, параметри звернення до програми. Таким чином, щоб знайти ім'я файлу, потрібно відшукати в оточенні ДОС два нулі поспіль - це ознака початку розширеної частини оточення. Слово, наступне за цією ознакою, містить кількість змінних в розширеній частині, за ним поміщаються самі змінні. Наприклад, в термінах асемблера структура оточення може бути такою:
db * COMSPEC == C: \ COMMAND. СОМ ', 0; Мінлива
COMSPEC db 'PATH = C: \; C: \ DOS; D: \ TP *, 0; Мінлива
PATH db * PROMPT == $ p $ g *, 0; Мінлива
PROMPT db 0; Ознака кінця
У цьому місці кінчається стандартна частина оточення і починається його розширена частина (тільки для ДОС 3.0 і вище!).
dw 2; Кількість змінних в розширеній частині
db 'D: \ MYDIR \ SETFAG. ЕХЕ', 0; Ім'я файлу
db * / NOBAK *, 0; Параметр виклику
Перед передачею управління програмою завантажувач копіює оточення в окрему область пам'яті і поміщає сегмент цієї області в PSPслово зі зміщенням 44 байти від початку PSP).
На закінчення слід сказати, що програми SetFag і Fag. Asm не є еталоном. Просто мені здалося, що такий спосіб організації захисту ЕХЕ-файлів буде досить зручним у використанні і ефективним в роботі. Дійсно, тестові зараження програм спеціально розробленим вірусом, а також вірусом Yankee показали, що фаг успішно виконує свої функції.
Оскільки програму Fag. Asm без особливих зусиль можна змінити, існує потенційна небезпека, що цей матеріал може бути використаний для розробки вірусів. Я дуже сподіваюся, що до Вас, шановний читачу, це не відноситься.

4.2. Програма AntiVir

Отже, ми розглянули спосіб, що дозволяє додати новостворюваної програмі властивості самоконтролю. А як бути з СОМ-файлами або захистити громіздку програму? Крім того, існують віруси, які вражають ^ е файли, а завантажувальні сектори дисків. Для таких вірусів (їх називають завантажувальними) контроль PSP може виявитися неефективним. Одним з можливих способів вирішення задачі є розробка спеціальної програми, яка перевіряє перший сектор найбільш важливих ЕХЕ і СОМ-файлів при кожному включенні ПК. Ця ж програма може перевірити головний завантажувальний сектор або навіть всі завантажувальні сектори на всіх дисках, щоб переконатися в отсутств1Щ завантажувальних вірусів, а при їх виявленні видалити їх.
Мною розроблена програма AntiVir (пріл.П9.1), реалізує описані функції. Ця програма створює і підтримує архів завантажувальних секторів та секторів PSP. Вона може працювати в двох режимах-автоматичному і діалоговому.
В автоматичному режимі AntiVir перевіряє поточний стан завантажувальних секторів і перших секторів для заданих файлів і порівнює їх з еталонними копіями, що зберігаються в архіві. У разі виявлення відмінностей програма повідомляє користувачеві про це і пропонує відновити еталонний стан відповідних секторів.
У діалоговому режимі програма надає користувачеві можливість переглянути і скоригувати список файлів, що перевіряють. Діалогова частина реалізована за допомогою об'єктно-орієнтованої бібліотеки Turbo Vision. Вибір потрібного режиму здійснюється автоматично: якщо програма викликається командою ДОС
ANTIVIR
вона переходить до діалогу з користувачем, якщо командою
ANTIVIR / AUTO
реалізується режим автоматичного контролю.
При контролі завантажувальних секторів програма використовує заходи, що дозволяють їй виявляти так звані віруси-невидимки. Такі віруси контролюють звернення до функцій і перериваннях ДОС, а також до переривання $ 13 BIOS і при спробі читання зараженого вірусом ділянки диска «підсовують» програмі збережену вірусом копію незараженої ділянки. Єдиним способом виявлення таких вірусів є безпосереднє звернення до контролера диска або прямий виклик переривання $ 13в постійної пам'яті BIOS. Оскільки BIOS звичайно враховує особливості конкретного контролера диска, другий шлях буде простим, однак для його реалізації необхідно якимось чином визначити початок в BIOS програми, що обробляє переривання $ 13 (відразу після завантаження ДОС вектор $ 13 перехоплюється програмами 1ВМ10.СОМ і показує на резидентну в оперативній пам'яті частина ДОС). Для визначення «чистого» вектора $ 13 в програмі використовується мультиплексной переривання $ 2F, яке для підфункції $ 13 повертає в регістрах DS '. DX потрібну адресу. Оскільки при цьому колишній уміст регістрів DS '. DX автоматично поміщається у вектор $ 13, це переривання необхідно викликати двічі поспіль з проміжним запам'ятовуванням регістрів DS'. DX в стеку (див. процедуру BuildArch у програмі ANTIVIR). У ході контролю завантажувальних секторів програма перепризначає зазвичай порожній вектор $ 62 так, щоб він вказував на вхід в обробник $ 13, і використовує потім цей вектор для прихованого від вірусу читання секторів жорсткого диска. На жаль цей прийом не можна використовувати для контролю архівних файлів, так як останнім часом широкого поширення набули програми динамічного стиснення / розкриття інформації (найпопулярнішими з таких програм є Double Space і Stacker). Контроль динамічно стислих дисків безпосереднім читанням секторів неможливий, тому що в цьому випадку відключається не тільки можливий вірус, але і резидентна програма-деархіватора. У результаті не вдається знайти початковий сектор захищається файлу і перевірити PSP програми.

5. ДЕЯКІ РЕКОМЕНДАЦІЇ

1) Вставляйте ім'я модуля F _ Anti в пропозицію Uses - «вакцинація» програми при її народженні гарантує стійкий імунітет на весь термін її експлуатації.
2) Якщо Ви часто використовуєте ЕХЕ-файли, що містять інструментальні програми (наприклад, пс.ехе, lexicon. exe і т.п.), рекомендую поставити на них фаг Fag. prg. речі, якщо Ви встановлюєте фаг на програму, захищену засобами модуля F _ Anti, вбудований в неї контроль виявить чужорідне тіло фага.
3) Усі СОМ-файли операційної програми і занадто громіздкі ЕХЕ-файли слід захистити програмою Antivir. Виклик цієї програми в автоматичному режимі (з ключем / AUTO) корисно включити в файл AUTOEXEC. BAT.
4) Намагайтеся якомога частіше архівувати на дискетах життєво важливі для Вас (і Вашого комп'ютера) файли.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Реферат
85.6кб. | скачати


Схожі роботи:
Методи захисту від комп`ютерних вірусів
Декілька класичних прикладів комп ютерних вірусів
Використання комп`ютерних програм у навчанні іноземної мови
Педагогічно-ергономічні вимоги до комп`ютерних програм навчального призначення
Педагогико ергономічні вимоги до комп`ютерних програм навчального призначення
Використання комп`ютерних програм для підвищення якості навчання студентів Челябінського державного 2
Використання комп`ютерних програм для підвищення якості навчання студентів Челябінського державного
Захист від несанкціонованої аудіозаписи Захист комп`ютерної інформації Криптографічні
Залежність від комп`ютерних ігор
© Усі права захищені
написати до нас